package Controlador;

import java.util.ArrayList;
import java.util.Date;
import java.util.Iterator;
import java.util.Vector;

import ControladorPersistencia.AdminCliente;
import ControladorPersistencia.AdminProveedor;
import Dao.CotizacionDao;
import Dao.SolicitudRodamientoDAO;
import Negocio.Cliente;
import Negocio.Cotizacion;
import Negocio.Factura;
import Negocio.ItemCotizacion;
import Negocio.ListaPreciosCPR;
import Negocio.Rodamiento;
import Negocio.SolicitudCompra;
import Negocio.SolicitudCompraCPR;
import Negocio.SolicitudRodamientos;
import Negocio.strategy.Descuento;
import Negocio.strategy.DtoExcesoStock;
import Negocio.strategy.DtoFormaPago;
import Negocio.strategy.DtoItems;
import Negocio.strategy.DtoVentasHistoricas;
import Negocio.strategy.DtoVolumenVenta;
import VO.ClienteVO;
import VO.CotizacionVO;
import VO.ItemCotizacionVO;
import VO.ItemSolicitudVO;
import VO.RodamientoVO;
import VO.SolicitudRodamientosVO;

public class Odv {
	private Vector<Cliente> clientes;
	//private Vector<decuentosActivos> descuentos;????
	private Vector<Factura>facturas;
	private Vector<SolicitudRodamientos> solicitudesrodamientos;
	private Vector<Cotizacion> Coticaciones;
	private Vector<SolicitudCompraCPR> solicitudescomrpas;
	
	public Vector<Cliente> getClientes() {
	return clientes;		
	}
	
	public void setClientes(Vector<Cliente> clientes) {
		this.clientes = clientes;
	}
	public Vector<Factura> getFacturas() {
		return facturas;
	}

	public void setFacturas(Vector<Factura> facturas) {
	this.facturas = facturas;
	}
	public ArrayList<SolicitudRodamientosVO> getSolicitudesrodamientos() {
		ArrayList<SolicitudRodamientos> ar = SolicitudRodamientoDAO.getInstancia().obtenerSolicitudesRodamiento();
		Iterator<SolicitudRodamientos> it = ar.iterator();
		ArrayList<SolicitudRodamientosVO> res = new ArrayList<SolicitudRodamientosVO>();
		while(it.hasNext())
		{
			res.add(solicitudRodToVO(it.next(),false));
		}
		return res;
	}
	public SolicitudRodamientosVO solicitudRodToVO(SolicitudRodamientos s,boolean fillitems)
	{
		SolicitudRodamientosVO so=new SolicitudRodamientosVO();
		so.setCliente(clienteToVO(s.getCliente()));
		so.setFecha(s.getFecha());
		so.setId(s.getId());
		if(fillitems)
		{
			//TODO: si hace falta implementar el fillitems
		}
		return so;
	}
	public void setSolicitudesrodamientos(
			Vector<SolicitudRodamientos> solicitudesrodamientos) {
		this.solicitudesrodamientos = solicitudesrodamientos;
	}
	public ArrayList<Cotizacion> getCoticaciones() {
		return new ArrayList<Cotizacion>(CotizacionDao.getInstancia().obtenerCotizaciones());
	}
	public void setSolicitudescoticaciones(
			Vector<Cotizacion> Coticaciones) {
		this.Coticaciones = Coticaciones;
	}
	public Vector<SolicitudCompraCPR> getSolicitudescomrpas() {
		return solicitudescomrpas;
	}
	public void setSolicitudescomrpas(Vector<SolicitudCompraCPR> solicitudescomrpas) {
		this.solicitudescomrpas = solicitudescomrpas;
	}
	public Odv() {
		
	}
	
	
	public void altacliente(ClienteVO cli){
		AdminCliente.getInstance().grabarCliente(voToCliente(cli));
	}
	
	public Cliente voToCliente(ClienteVO cv)
	{
		Cliente c=new Cliente();
		c.setCuit(cv.getCuit());
		c.setDireccion(cv.getDireccion());
		c.setFechaalta(cv.getFechaalta());
		c.setRazonsocial(cv.getRazonsocial());
		c.setReposnsableInscripto(cv.isReposnsableInscripto());
		c.setTelefono(cv.getTelefono());
		return c;
	}

	public ClienteVO clienteToVO(Cliente cv)
	{
		ClienteVO c=new ClienteVO();
		c.setId(cv.getId());
		c.setCuit(cv.getCuit());
		c.setDireccion(cv.getDireccion());
		c.setFechaalta(cv.getFechaalta());
		c.setRazonsocial(cv.getRazonsocial());
		c.setReposnsableInscripto(cv.esReposnsableInscripto());
		c.setTelefono(cv.getTelefono());
		return c;
	}

	public Cliente buscarcliente(int id){
		Cliente cliente = AdminCliente.getInstance().buscarClienteXId(id);
		
		return cliente;
	}
	
	public Cliente buscarcliente(String cuit){
		Cliente cliente = AdminCliente.getInstance().buscarClienteXCuit(cuit);
		return cliente;
	}
	
	
	public void bajacliente(int id){
		AdminCliente.getInstance().borrarCliente(id);
		
	}
	
	
	public void modificarcliente(ClienteVO c){
		AdminCliente.getInstance().modificarCliente(voToCliente(c));
	}
	
	
	
	
	public void generarsolicitudrodamientos(ClienteVO clienteVO, Vector<ItemSolicitudVO> itemsVO ) throws Exception{
		
		Cliente cliente = buscarCliente(clienteVO);
		
		Date hoy = new Date();
		SolicitudRodamientos solicitud = new SolicitudRodamientos(cliente, hoy);
		
		
		for(int i=0; i<itemsVO.size(); i++){
			RodamientoVO rodVO = itemsVO.elementAt(i).getRodamiento();
			Rodamiento rod = buscarRodamiento(rodVO.getId());
			int cant = itemsVO.elementAt(i).getCantidad();
			String origen = itemsVO.elementAt(i).getRodamiento().getOrigen();
			String marca = itemsVO.elementAt(i).getRodamiento().getMarca();
			solicitud.agregarItem(rod, cant, marca, origen);	
		}
	
		cotizarSolicitud(solicitud);
		solicitudesrodamientos.add(solicitud);
		
	}
	
	private void cotizarSolicitud(SolicitudRodamientos solicitud) throws Exception {
		
		/*Para Generar la cotizacion tomo el precio de cada */
		
		
		Cotizacion cot= new Cotizacion(solicitud, 30);

		

		float descuento = calcularDescuento(cot.getSolitudRodamientos().getCliente(),cot);
		cot.setTotalConDescuento(cot.getTotalSinDescuento()*(1-descuento));
		cot.SetDescuentoPorcentaje(descuento);
		CotizacionDao.getInstancia().actualizar(cot);
	}
	
	
	private Rodamiento buscarRodamiento(Object id) {
		// TODO Auto-generated method stub
		return null;
	}
	private Cliente buscarCliente(ClienteVO clienteVO) {
		
		if(clienteVO.getId()!=-1)
		{
			return buscarcliente(clienteVO.getId());
		}
		if(clienteVO.getCuit()!=null && !clienteVO.getCuit().equals(""))
		{
			return buscarcliente(clienteVO.getCuit());
		}
		if(clienteVO.getRazonsocial()!=null && !clienteVO.getRazonsocial().equals(""))
		{
			return AdminCliente.getInstance().buscarClienteXNombre(clienteVO.getRazonsocial());
		}
		return null;
	}
	
	public Rodamiento buscarrodamiento(String id){
		Rodamiento rodamiento=null;
		
		
		return rodamiento;
	}
	
	public void aceptarCotizacion(CotizacionVO cotizacionVO) throws Exception{
		
		
		Cotizacion cotizacion = buscarCotizacion(cotizacionVO.getId());
		cotizacion.aprobarCotizacion();

		CotizacionDao.getInstancia().actualizar(cotizacion);
		
		
		
		
		
		/*
		Cotizacion cotizacion = buscarCotizacion(cotizacionVO.getId());
		
		Vector<ItemCotizacionVO> itemsVO = cotizacionVO.getItems();
		ArrayList<ItemCotizacion> items = cotizacion.getItems();
		
		
		
		if(items.size() != itemsVO.size()){
			Vector<ItemSolicitudVO> itemsSolVo  = new Vector<ItemSolicitudVO>();
			
			for(int i = 0; i < itemsVO.size(); i++){
				ItemSolicitudVO item = new ItemSolicitudVO();
				int cantidad = itemsVO.elementAt(i).getCantidad();
				RodamientoVO rodamiento = itemsVO.elementAt(i).getRodamiento();
				item.setCantidad(cantidad);
				item.setRodamiento(rodamiento);
				itemsSolVo.add(item);			
			}
			ClienteVO clienteVO = cotizacionVO.getSolitudRodamientos().getCliente();
			generarsolicitudrodamientos(clienteVO, itemsSolVo);
			
			Coticaciones.remove(cotizacion);
			
		}else{
			boolean aux = true;
			
			for(int i = 0 ; i < itemsVO.size(); i++){
				ItemCotizacion item = items.get(i);
				int cantVo = itemsVO.elementAt(i).getCantidad();
				int idRodVo = itemsVO.elementAt(i).getRodamiento().getId();
				
				for(int j = 0; j < items.size(); i++){
					int cant = items.get(j).getCantidad();
					Integer idRod = items.get(j).getRodamiento().getIdRodamientoId();
					
					if(cant != cantVo && !idRod.equals(idRodVo)){
						aux = false;
						j = items.size();
						i = j;
					}
				}
			}
			
			if(!aux){
				Vector<ItemSolicitudVO> itemsSolVo  = new Vector<ItemSolicitudVO>();
				
				for(int i = 0; i < itemsVO.size(); i++){
					ItemSolicitudVO item = new ItemSolicitudVO();
					int cantidad = itemsVO.elementAt(i).getCantidad();
					RodamientoVO rodamiento = itemsVO.elementAt(i).getRodamiento();
					item.setCantidad(cantidad);
					item.setRodamiento(rodamiento);
					itemsSolVo.add(item);			
				}
				ClienteVO clienteVO = cotizacionVO.getSolitudRodamientos().getCliente();
				generarsolicitudrodamientos(clienteVO, itemsSolVo);
				
				Coticaciones.remove(cotizacion);
			}else{
				SolicitudCompraCPR solicitud = new SolicitudCompraCPR(cotizacion, "Pendiente");
				solicitudescomrpas.add(solicitud);
				
			}
			
		}
		*/
	}
	
	private Cotizacion buscarCotizacion(int id) {
		return CotizacionDao.getInstancia().obtenerCotizacion(id);
	}

	public void facturar(SolicitudCompraCPR solicitudcompracpr){
		
	}
	
	
	private Float calcularDescuento(Cliente cliente, Cotizacion cotizacion){
	
		Vector<Factura> facturas = getFacturasCliente( cliente);
		
		Descuento desc1 = new Descuento(new DtoFormaPago());
		Descuento desc2 = new Descuento(new DtoVentasHistoricas());
		Descuento desc3 = new Descuento(new DtoVolumenVenta());
		Descuento desc4 = new Descuento(new DtoExcesoStock());
		Descuento desc5 = new Descuento(new DtoItems());
		
		
		Float descuento_1 = desc1.calcular(cliente, cotizacion, facturas);
		Float descuento_2 = desc2.calcular(cliente, cotizacion, facturas);
		Float descuento_3 = desc3.calcular(cliente, cotizacion, facturas);
		Float descuento_4 = desc4.calcular(cliente, cotizacion, facturas);
		Float descuento_5 = desc5.calcular(cliente, cotizacion, facturas);
		
		Float totalPercDesc = descuento_1;
		
		if(descuento_2 > totalPercDesc){
			totalPercDesc = descuento_2;
		}
		if(descuento_3 > totalPercDesc){
			totalPercDesc = descuento_3;
		}
		if(descuento_4 > totalPercDesc){
			totalPercDesc = descuento_4;
		}
		if(descuento_5 > totalPercDesc){
			totalPercDesc = descuento_5;
		}
		
		return totalPercDesc;
	}
	
	 public int cargarSolicitudRodamientos(String xml) {
		  SolicitudRodamientos svo=new SolicitudRodamientos();
    	   System.out.println("Recuperando solicitud de xml");
		  svo.fromXml(xml);
		   System.out.println("Salvando solicitud");
		  SolicitudRodamientoDAO.getInstancia().grabarSolicitudRodamiento(svo);
		   System.out.println("Cotizando solicitud");
		  try {
		   cotizarSolicitud(svo);
		   System.out.println("solicitud cotizada!!");
		  } catch (Exception e) {
		   // TODO Auto-generated catch block
		   e.printStackTrace();
		  }
		  return svo.getId();
		 }
	private Vector<Factura> getFacturasCliente(Cliente cliente) {
		// TODO Auto-generated method stub
		return null;
	}
	
	public CotizacionVO cotizacionToVO(Cotizacion c)
	{
		CotizacionVO cv = new CotizacionVO();
		cv.setFecha(c.getFecha());
		// cv.setCompPrecios(c.getCompPrecios());
		cv.setId(c.getId());
		cv.setIngBrutos(c.getIngBrutos());
		cv.setIva(c.getIva());
		cv.setSolitudRodamientos(solicitudRodToVO(c.getSolitudRodamientos(), false));
		//TODO Completar los campos faltantes en cotizacionToVO
		return cv;
	}
}
